﻿#define  _CRT_SECURE_NO_WARNINGS 1
//其实自定义函数和库函数是一样的，形式如下：
//ret_type fun_name(形式参数)
// {
// 
// }
// 
// 其中ret_type是函数返回类型 fun_name是函数名  括号中放的是形式参数 {}括起来的是函数体
//有时返回类型可以是void,即表示什么都不返回,函数的参数也可以是void表示函数没有参数，如果有参数要交代清楚
// 如print就是无参无返回值  调用的时候直接这样print()
// 参数的类型和名字以及个数
#include <stdio.h>
//写一个加法函数，完成两个整型变量的加法操作
//1.有两个整型变量（参数） 2.计算（函数体） 3.和（计算的结果）
//int Add(int x, int y) //整型  x和y分别接受两个整型  Add前面是返回类型int
//{
//	int z = 0;
//	z = x + y;
//	return z;  //返回z的值
//}
////此函数还可以简化为
//int Add(int x, int y)
//{
//	return x + y;
//}
//int main()
//{
//	int a = 0;
//	int b = 0;
//	//输入
//	scanf("%d %d", &a, &b);
//	//计算
//	//int c = a + b;  这是以前的方法不是函数
//	int c = Add(a, b);  //借助add函数来计算ab之和 所以我们要调用函数  //c来接受函数的返回值
//	////输出
//	printf("%d\n", c);
//	return 0;
//}
//void print(void)  //表示我不需要传参 没有返回值
//{
//	printf("hello world\n");
//}
//int main()
//{
//	print();
//	print(1);//明知山有虎偏向虎山行
//	print(100);  //打印出来还是hello world  可以传参，但是我不用，编译器会报警告
//	return 0;
//}




//实际参数就是真实传递给函数的参数 
//如何上面调用加法函数的时候，传递给函数的参数a和b就是实际参数 - 实参
//上面的加法函数中的x y就称为形式参数
//为什么叫形式参数呢？实际上，如果只是定义了 Add 函数，⽽不去调⽤的话， Add 函数的参数 x
//和 y 只是形式上存在的，不会向内存申请空间，不会真实存在的，所以叫形式参数。形式参数只有在
//函数被调⽤的过程中为了存放实参传递过来的值，才向内存申请空间，这个过程就是形参的实例化。
//可以理解为形参是实参的⼀份临时拷⻉。
//虽然我们提到了实参是传递给形参的，他们之间是有联系的，
// 但是形参和实参各⾃是独⽴的内存空间
//x和y确实得到了a和b的值，但是x和y的地址和a和b的地址是不⼀样
//.return 语句
//在函数的设计中，函数中经常会出现return语句，这⾥讲⼀下return语句使⽤的注意事项。
// return后边可以是⼀个数值，也可以是⼀个表达式，如果是表达式则先执⾏表达式，再返回表达式
//的结果。如下
// return后边也可以什么都没有，直接写 return; 这种写法适合函数返回类型是void的情况。如下
// return返回的值和函数返回类型不⼀致，系统会⾃动将返回的值隐式转换为函数的返回类型。如下
//•return语句执⾏后，函数就彻底返回，后边的代码不再执⾏。
//•如果函数中存在if等分⽀的语句，则要保证每种情况下都有return返回，否则会出现编译错误 如下
//int test()
//{
//	int a = 0;
//	scanf("%d", &a);
//	if (a > 0)
//		return 1;  把值1返回去给test
//	else
//		return -1;
//}
//int main()
//{
//	int ret = test();
//	printf("%d\n", ret);
//		return 0;
//}

//void test()
//{
//	printf("hehe\n");
//	if (1)
//		return;  //不需要加任何东西，因为返回类型为void   无返回值
//	printf("haha\n");
//}
//
//int main()
//{
//	test();
//	return 0;
//}


//int test()
//{
//	return 3.14; //这double类型，但是函数的返回类型是整型
//}
//int main()
//{
//	int r = test();   //编辑器警告 从“double”转换到“int”，可能丢失数据
//	printf("%d\n", r);  //打印出的结果是3
//
//	return 0;
//}

//错误的示范
//int test()   //函数的返回类型不写  编译器会默认返回整型
//{
//	int a = 0;
//	scanf("%d", &a); 
//	if (a)  //编译器警告:"test"不是所有的控件路径都返回值
//		return 1;
//}
//int main()
//{
//	int r = test();
//	return 0;
//}
//函数的返回类型如果没写的话，编译器认为返回的是int类型的值
//如果函数要求返回值，但是函数中没有return返回值，那具体返回什么就不确定了
//test()
//{
//	printf("hehea\n");
//}
//int main()
//{
//	int r = test();
//	printf("%d\n", r);
//}